import { EapproverType, Etype, IappointMemberInfo, IappointRoleInfo, IbackInfo, IconditionInfo, IcopyInfo, IformInfo, IleaderInfo, IsponsorChoseInfo, IsponsorSelf, IstartInfo } from "./basic.interface";


/** 审批流程info */
interface IProcessInfo {
    id?: string; // id
    name: string; // 审批流名称
    createTime: string; // 创建时间
    updateTime: string; // 更新时间
    newVersionId?: string; // 新生成的id。可用于版本控制：当编辑时，将新生成的id添加到这个字段，当作关联
    
    nodeInfo: InodeStart; // 第一个节点一定是start
    formData: IformInfo[]; // 所有会用到的表单项集合
}




type TnodeInfo = InodeApprover | InodeCondition | InodeCopy | InodeBack;

/** 节点基础信息 */
interface InodeBasic {
    nodeId: string; // 节点唯一id
    prevId?: string; // 除了start节点，其他节点的prevId一定存在
    title: string; // 节点标题
    type: keyof Etype; // 节点类型
    content: string[]; // 节点上展示的内容 - 因为可能有多个，所以用数组记录

    /** 
     * 这里有一个点
     *  - 如果condition不为空，就说明这个节点的下一个内容一定是分支，否则就是普通节点
     *  - 并且如果这种情况下，child也不为空，则一定是分支的合并点
     */
    childNode?: TnodeInfo;
    conditionNodes?: TnodeInfo[];
}

/** start */
interface InodeStart extends InodeBasic {
    type: Etype['start'];
    prevId: undefined;

    startInfo: IstartInfo; // info-发起人
}

/** approver */
interface InodeApprover extends InodeBasic {
    type: Etype['approver'];
    prevId: string;
    approverType: keyof EapproverType; // 审批类型

    appointMemberInfo?: IappointMemberInfo; // info-指定成员
    appointRoleInfo?: IappointRoleInfo; // info-指定角色
    leaderInfo?: IleaderInfo; // info-指定成员
    sponsorSelfInfo?: IsponsorSelf; // info-指定成员
    sponsorChoseInfo?: IsponsorChoseInfo; // info-指定成员
}

/** condition */
interface InodeCondition extends InodeBasic {
    type: Etype['condition'];
    prevId: string;
    sort: number; // 条件优先级

    conditionInfo: IconditionInfo[]; // info-条件列表
}

/** copy */
interface InodeCopy extends InodeBasic {
    type: Etype['copy'];
    prevId: string;
    allowSelf: boolean; // 是否允许发起人抄送自己
    
    copyInfo: IcopyInfo; // info-抄送人
}

/** back */
interface InodeBack extends InodeBasic {
    type: Etype['back'];
    prevId: string;

    /**
     * 至于可以退回到哪一步的节点
     * n叉树向上递归，递归出口为（两种情况）
     *  - 不存在prevId - 也就是start
     *  - 当前节点同时存在 child和condition - 也就是遇到分支合并的时候（当然，这种情况未必能够满足实际业务，所以需要考虑是否要将结点之前的所有节点获得到）
     */
    backNodeId: string; // 要退回的节点id
    /**
     * 其实目前就一个可以考虑保留的，就是可退回选项
     * 但是这个东西当节点树发生变化时，要更新这个list，不好监控，所以只在点开详情的时候再去向上查询，生成opts
     * 并且理论上，需要checkbackNodeId是否有效存在
     */
    backInfo: IbackInfo; // info-退回信息
}







const formData: IformInfo[] = [
    {
        formKey: 'SELECT',
        formLabel: "学历",
        formId: 'xueli',
        placeholder: '请选择学历',
        options: [{id: '博士', name: '博士'}]
    }
]
const processDemo: IProcessInfo = {
    name: "测试审批流",
    createTime: "2023-03-02",
    updateTime: "2023-03-02",
    nodeInfo: {
        nodeId: 'idstart1',
        prevId: undefined,
        type: 'start', 
        startInfo: {
            value: [],
            startType: 'all',
        }, 
        title: '开始节点', 
        content: ['全公司，所有人'],
        conditionNodes: [
            {
                title: '条件1',
                content: [''],
                type: 'condition',
                nodeId: 'con1',
                prevId: 'idstart1',
                sort: 1,
                conditionInfo: [],
                childNode: {
                    type: 'approver',
                    nodeId: 'idapp2',
                    prevId: 'con1',
                    title: '分支1的审批人',
                    content: ['张三'],
                    childNode: {
                        type: 'copy',
                        nodeId: 'idcopy1',
                        prevId: 'idapp2',
                        title: '分支1审批人下面的抄送',
                        content: ['抄送研发部']
                    } as InodeCopy
                } as InodeApprover
            },
            {
                title: '条件2',
                content: [''],
                type: 'condition',
                nodeId: 'con2',
                prevId: 'idstart1',
                sort: 2,
                conditionInfo: [],
                childNode: {
                    type: 'approver',
                    nodeId: 'idapp3',
                    prevId: 'con2',
                    title: '分支2的审批人',
                    content: ['王五'],
                } as InodeApprover
            },
        ],
        childNode: {
            type: 'approver',
            nodeId: 'idapp1',
            prevId: 'idstart1',
            title: '',
            content: ['李四'],
        } as InodeApprover,
    },
    formData: formData
}



